package com.zyf.project.kvdb.protocol.uri;

import com.zyf.project.kvdb.protocol.exception.KVDBException;

import java.net.URI;

/**
 * <h1>KVDB URI</h1>
 * <p>
 * URI 全称是 Uniform Resource Identifier，也就是<b>统一资源标识符</b>；<br>
 * 与之相关的，URL 全称是 Uniform Resource Location，也就是<b>统一资源位置</b>
 * </p>
 * <p>
 * URI 是一种采用特定的语法标识一个资源的字符串表示。<br>
 * URI 所标识的资源可能是服务器上的一个文件，也可能是一个邮件地址、图书、主机名等。<br>
 * 简单地说，URI 是标识一个资源的字符串<br>
 * URI 的语法构成是：一个模式和一个模式特定部分
 * </p>
 *
 * @author Zhou Yifan
 */
public class KVDBURI {

    /**
     * KVDB URI 的模式
     */
    private static final String SCHEME = "kvdb";
    /**
     * KVDB URI 的字符串
     */
    private String origin;
    /**
     * KVDB URI
     */
    private URI uri;

    public KVDBURI(String origin) throws KVDBException {
        this.origin = origin;
        this.uri = URI.create(origin);
        if (!SCHEME.equals(uri.getScheme())) {
            throw new KVDBException("Unsupported URI! The scheme should be \"kvdb\" But the origin URI is: " + origin);
        }
    }

    public String getOrigin() {
        return origin;
    }

    public String getHost() {
        return uri.getHost();
    }

    public int getPort() {
        return uri.getPort();
    }

    /**
     * Get database from URI
     *
     * @return
     */
    public String getDatabase() {
        return uri.getPath().replace("/", "");
    }

    /**
     * 是否是本地地址
     *
     * @return
     */
    public boolean isLocalhost() {
        return URIUtils.isLocalhost(getHost());
    }

    @Override
    public String toString() {
        return "KVDBURI{" +
                "origin='" + origin + '\'' +
                ", uri=" + uri +
                '}';
    }
}
